package com.demo.controller;

import com.demo.utils.PDFBOXUtil;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.HashMap;
import java.util.Map;


@RestController
@RequestMapping("pdf")
public class PDFController {

    /**
     * 读取指定页面上的文本
     *
     * @param file
     * @param pageNo
     * @return
     * @throws IOException
     */
    @RequestMapping("redOnePageText")
    public String redOnePageText(@RequestPart(name = "file") MultipartFile file, @RequestParam(required = true) Integer pageNo) {
        String text = null;
        try {
            InputStream inputStream = file.getInputStream();
            // 1、加载指定PDF文档
            PDDocument document = PDDocument.load(inputStream);
            // 2、创建文本提取对象
            PDFTextStripper stripper = new PDFTextStripper();
            // 指定页面读取内容
            stripper.setStartPage(pageNo);
            stripper.setEndPage(pageNo);
            // 3、获取指定页面的文本内容
            text = stripper.getText(document);
            System.out.println("获取文本内容: " + text);
            inputStream.close();
            // 4、关闭
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return text;
    }

    /**
     * 创建一个摸版
     */
    @RequestMapping("creatTemplate")
    public void creatTemplate() throws IOException {
        // 1、创建文档对象
        PDDocument doc = new PDDocument();
        // 2、添加空白页面，大小是 A4 纸那么大
        PDPage page = new PDPage(PDRectangle.A4);
        doc.addPage(page);

        // TODO 添加文本内容，指定文档对象、页面对象
        PDPageContentStream stream = new PDPageContentStream(doc, page);
        // 文本开始
        stream.beginText();
        // 设置内容流文本的字体、字体大小
        stream.setFont(PDType0Font.load(doc, new File("src/main/resources/经典宋体简.ttf")), 14);
        String content1 = "姓名：{name}                     年龄：{age}";
        // 设置内容流文本显示的起始坐标位置
        stream.newLineAtOffset(50, page.getMediaBox().getHeight() - 100);
        // 设置需要添加的文本内容，注意：中文内容写入时候，需要保证字体支持中文
        stream.showText(content1);

        stream.setLeading(20);
        // 新增一个新行显示
        stream.newLine();
        String content2 = "电话：{phone}                    地址：{addr}";
        stream.showText(content2);

        stream.endText(); // 文本结束
        stream.close(); // 关闭内容流

        // 3、生成pdf文件，保存pdf文件
        // 这里会在D盘下生成一个 demo.pdf 空白的pdf文档
        doc.save("D:\\docker-images\\demo.pdf");
        // 4、关闭文档流
        doc.close();
    }


    /**
     *替换摸版内数据
     */
    @RequestMapping("writeData")
    public void writeData(@RequestParam(required = true) String name, @RequestParam(required = true) String age
            , @RequestParam(required = true) String phone, @RequestParam(required = true) String addr) throws IOException {
        Map<String, String> keyWordMap = new HashMap<>();
        keyWordMap.put("{name}", name);
        keyWordMap.put("{age}", age);
        keyWordMap.put("{phone}", phone);
        keyWordMap.put("{addr}", addr);
        // 模拟测试
        PDFBOXUtil.replaceText(keyWordMap, "D:\\docker-images\\demo.pdf", "D:\\docker-images\\test40.pdf");
    }
}
